﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace BreukTrainerOnline.Models
{

    /*
     * Deze klasse dient om methodes toe te voegen
     * aan de door linq gegenereerde klasse Leerling
     */
    partial class Leerling
    {
        private static BreukTrainerDataContext db =
            new BreukTrainerDataContext();

        public decimal GetScore(long OpdrachtID)
        {
            return db.GetScore(this.LeerlingID, OpdrachtID) ?? 0;
        }

        public IQueryable<LeerlingOpdrachtDetail>
        GetLeerlingOpdrachtDetailsByOpdrachtID(long OpdrachtID)
        {
            return (from lod in this.LeerlingOpdrachtDetails
                    where lod.OpdrachtDetail.OpdrachtID == OpdrachtID
                    select lod).AsQueryable<LeerlingOpdrachtDetail>();
        }

    }


    public class BreukTrainerRepository
    {
        private static BreukTrainerDataContext db = 
            new BreukTrainerDataContext();


        public IQueryable<Opdracht> GetOpdrachten()
        {
            return db.Opdrachts;
        }

        public Opdracht GetOpdrachtByID(long id)
        {
            return (from o in GetOpdrachten()
                    where o.OpdrachtID == id
                    select o).Single();
        }

        public IQueryable<OpdrachtDetail> GetOpdrachtDetails()
        {
            return db.OpdrachtDetails;
        }

        public IQueryable<OpdrachtDetail> GetOpdrachtDetailsByOpdrachtID(long? id)
        {
            if (id == null)
            {
                return GetOpdrachtDetails();
            }
            else
            {
                return from od in db.OpdrachtDetails
                        where od.OpdrachtID == id
                        select od;
            }
        }

        public void DeleteOpdracht(long id)
        {
            Opdracht opdracht = GetOpdrachtByID(id);

            if (opdracht.Status != true)
            {
                foreach (OpdrachtDetail od in opdracht.OpdrachtDetails)
                {
                    db.OpdrachtDetails.DeleteOnSubmit(od);
                }
                foreach (LeerlingOpdracht lo in opdracht.LeerlingOpdrachts)
                {
                    db.LeerlingOpdrachts.DeleteOnSubmit(lo);
                }
                db.Opdrachts.DeleteOnSubmit(opdracht);
                db.SubmitChanges();
            }
        }

        public IQueryable<Leerling> GetLeerlingByOpdrachtID(long id)
        {
            return (from lo in GetOpdrachtByID(id).LeerlingOpdrachts
                    select lo.Leerling).AsQueryable<Leerling>();
        }

        public LeerlingOpdracht GetLeerlingOpdracht(long OpdrachtID, long LeerlingID)
        {
            Opdracht o = GetOpdrachtByID(OpdrachtID);
            return (from lo in o.LeerlingOpdrachts
                    where lo.LeerlingID == LeerlingID
                    select lo).Single();
        }

        public void AddOpdracht(Opdracht nieuweOpdracht)
        {
            db.Opdrachts.InsertOnSubmit(nieuweOpdracht);
            db.SubmitChanges();
        }

        public void AddDetailOpdracht(OpdrachtDetail nieuweOpdrachtDetail)
        {
            db.OpdrachtDetails.InsertOnSubmit(nieuweOpdrachtDetail);
            Opdracht o = GetOpdrachtByID(nieuweOpdrachtDetail.OpdrachtID);
            nieuweOpdrachtDetail.Opdracht = o;
            o.OpdrachtDetails.Add(nieuweOpdrachtDetail);
            db.SubmitChanges();
        }

        public void AddDetailsOpdracht(List<OpdrachtDetail> nieuweOpdrachtDetails)
        {
            foreach(OpdrachtDetail od in nieuweOpdrachtDetails)
            {
                AddDetailOpdracht(od);
            }
        }

        public IQueryable<Leerling> GetLeerlingen()
        {
            return db.Leerlings;
        }

        public IEnumerable<string> GetKlassenLijst()
        {
            var lijst = (from leerling in db.Leerlings
                         select leerling.Klas).Distinct();
            return lijst;
        }

        public void AddKlasToOpdracht(string Klas, Opdracht opdracht)
        {
            var leerlingen = from lln in db.Leerlings
                             where lln.Klas == Klas
                             select lln;

            foreach (Leerling leerling in leerlingen)
            {
                LeerlingOpdracht lo = new LeerlingOpdracht();
                lo.LeerlingID = leerling.LeerlingID;
                lo.Leerling = leerling;
                lo.OpdrachtID = opdracht.OpdrachtID;
                lo.Opdracht = opdracht;
                leerling.LeerlingOpdrachts.Add(lo);
                opdracht.LeerlingOpdrachts.Add(lo);
                db.LeerlingOpdrachts.InsertOnSubmit(lo);
            }
            db.SubmitChanges();
        }

        public IQueryable<Leerling> GetLeerlingByID(long id)
        {
            return (from lo in db.Leerlings 
                    where lo.LeerlingID == id
                    select lo).AsQueryable<Leerling>();
        }

        public void AddLeerlingOpdrachtDetail(LeerlingOpdrachtDetail lod)
        {
            var leerling = (from l in db.Leerlings
                            where l.LeerlingID == lod.LeerlingID
                            select l).Single();
            leerling.LeerlingOpdrachtDetails.Add(lod);
            lod.Leerling = leerling;

            var OpdrachtDetail = (from od in db.OpdrachtDetails
                                  where od.OpdrachtDetailID == lod.OpdrachtDetailID
                                  select od).Single();
            OpdrachtDetail.LeerlingOpdrachtDetails.Add(lod);
            lod.OpdrachtDetailID = OpdrachtDetail.OpdrachtDetailID;
            lod.OpdrachtDetail = OpdrachtDetail;
            db.LeerlingOpdrachtDetails.InsertOnSubmit(lod);
            db.SubmitChanges();
        }

        public void addLeerlingOpdrachtDetails(List<LeerlingOpdrachtDetail> nieuweOplossingen)
        {
            foreach (LeerlingOpdrachtDetail lod in nieuweOplossingen)
            {
                AddLeerlingOpdrachtDetail(lod);
            }
        }
    }
}